//+------------------------------------------------------------------+
//|                                                    OrderInfo.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Object.h>

//+------------------------------------------------------------------+
//| 订单信息类                                                       |
//| 用途：访问订单信息的类                                           |
//|         继承自 CObject 类                                        |
//+------------------------------------------------------------------+
class COrderInfo : public CObject
{
protected:
   ulong             m_ticket;             // 订单ticket
   ENUM_ORDER_TYPE   m_type;               // 订单类型
   ENUM_ORDER_STATE  m_state;              // 订单状态
   datetime          m_expiration;        // 订单过期时间
   double            m_volume_curr;        // 当前交易量
   double            m_price_open;         // 开仓价格
   double            m_stop_loss;          // 止损价格
   double            m_take_profit;        // 止盈价格

public:
   /** 构造函数 */
   COrderInfo(void);
   
   /** 析构函数 */
   ~COrderInfo(void);
   
   /**
    * 获取订单ticket
    * @return 订单ticket
    */
   ulong             Ticket(void) const;
   
   /**
    * 获取订单设置时间
    * @return 订单设置时间
    */
   datetime          TimeSetup(void) const;
   
   /**
    * 获取订单设置时间（毫秒）
    * @return 订单设置时间（毫秒）
    */
   ulong             TimeSetupMsc(void) const;
   
   /**
    * 获取订单完成时间
    * @return 订单完成时间
    */
   datetime          TimeDone(void) const;
   
   /**
    * 获取订单完成时间（毫秒）
    * @return 订单完成时间（毫秒）
    */
   ulong             TimeDoneMsc(void) const;
   
   /**
    * 获取订单类型
    * @return 订单类型枚举值
    */
   ENUM_ORDER_TYPE   OrderType(void) const;
   
   /**
    * 获取订单类型描述
    * @return 订单类型描述字符串
    */
   string            TypeDescription(void) const;
   
   /**
    * 获取订单状态
    * @return 订单状态枚举值
    */
   ENUM_ORDER_STATE  State(void) const;
   
   /**
    * 获取订单状态描述
    * @return 订单状态描述字符串
    */
   string            StateDescription(void) const;
   
   /**
    * 获取订单过期时间
    * @return 订单过期时间
    */
   datetime          TimeExpiration(void) const;
   
   /**
    * 获取订单成交类型
    * @return 订单成交类型枚举值
    */
   ENUM_ORDER_TYPE_FILLING TypeFilling(void) const;
   
   /**
    * 获取订单成交类型描述
    * @return 订单成交类型描述字符串
    */
   string            TypeFillingDescription(void) const;
   
   /**
    * 获取订单时间类型
    * @return 订单时间类型枚举值
    */
   ENUM_ORDER_TYPE_TIME TypeTime(void) const;
   
   /**
    * 获取订单时间类型描述
    * @return 订单时间类型描述字符串
    */
   string            TypeTimeDescription(void) const;
   
   /**
    * 获取订单魔术码
    * @return 魔术码
    */
   long              Magic(void) const;
   
   /**
    * 获取订单持仓ID
    * @return 持仓ID
    */
   long              PositionId(void) const;
   
   /**
    * 获取订单关联持仓ID
    * @return 关联持仓ID
    */
   long              PositionById(void) const;
   
   /**
    * 获取订单初始交易量
    * @return 初始交易量
    */
   double            VolumeInitial(void) const;
   
   /**
    * 获取订单当前交易量
    * @return 当前交易量
    */
   double            VolumeCurrent(void) const;
   
   /**
    * 获取订单开仓价格
    * @return 开仓价格
    */
   double            PriceOpen(void) const;
   
   /**
    * 获取订单止损价格
    * @return 止损价格
    */
   double            StopLoss(void) const;
   
   /**
    * 获取订单止盈价格
    * @return 止盈价格
    */
   double            TakeProfit(void) const;
   
   /**
    * 获取订单当前价格
    * @return 当前价格
    */
   double            PriceCurrent(void) const;
   
   /**
    * 获取订单限价价格
    * @return 限价价格
    */
   double            PriceStopLimit(void) const;
   
   /**
    * 获取订单交易品种
    * @return 交易品种
    */
   string            Symbol(void) const;
   
   /**
    * 获取订单注释
    * @return 订单注释
    */
   string            Comment(void) const;
   
   /**
    * 获取订单外部ID
    * @return 外部ID
    */
   string            ExternalId(void) const;
   
   /**
    * 获取整数型订单信息
    * @param prop_id 属性ID
    * @param var 输出值
    * @return 成功返回 true，失败返回 false
    */
   bool              InfoInteger(const ENUM_ORDER_PROPERTY_INTEGER prop_id, long &var) const;
   
   /**
    * 获取浮点型订单信息
    * @param prop_id 属性ID
    * @param var 输出值
    * @return 成功返回 true，失败返回 false
    */
   bool              InfoDouble(const ENUM_ORDER_PROPERTY_DOUBLE prop_id, double &var) const;
   
   /**
    * 获取字符串型订单信息
    * @param prop_id 属性ID
    * @param var 输出值
    * @return 成功返回 true，失败返回 false
    */
   bool              InfoString(const ENUM_ORDER_PROPERTY_STRING prop_id, string &var) const;
   
   /**
    * 格式化订单类型
    * @param str 输出字符串
    * @param type 订单类型
    * @return 格式化后的字符串
    */
   string            FormatType(string &str, const uint type) const;
   
   /**
    * 格式化订单状态
    * @param str 输出字符串
    * @param status 订单状态
    * @return 格式化后的字符串
    */
   string            FormatStatus(string &str, const uint status) const;
   
   /**
    * 格式化订单成交类型
    * @param str 输出字符串
    * @param type 成交类型
    * @return 格式化后的字符串
    */
   string            FormatTypeFilling(string &str, const uint type) const;
   
   /**
    * 格式化订单时间类型
    * @param str 输出字符串
    * @param type 时间类型
    * @return 格式化后的字符串
    */
   string            FormatTypeTime(string &str, const uint type) const;
   
   /**
    * 格式化订单信息
    * @param str 输出字符串
    * @return 格式化后的订单信息
    */
   string            FormatOrder(string &str) const;
   
   /**
    * 格式化订单价格
    * @param str 输出字符串
    * @param price_order 订单价格
    * @param price_trigger 触发价格
    * @param digits 小数点位数
    * @return 格式化后的价格字符串
    */
   string            FormatPrice(string &str, const double price_order, const double price_trigger, const uint digits) const;
   
   /**
    * 选择当前订单
    * @return 成功返回 true，失败返回 false
    */
   bool              Select(void);
   
   /**
    * 通过ticket选择订单
    * @param ticket 订单ticket
    * @return 成功返回 true，失败返回 false
    */
   bool              Select(const ulong ticket);
   
   /**
    * 通过索引选择订单
    * @param index 索引位置
    * @return 成功返回 true，失败返回 false
    */
   bool              SelectByIndex(const int index);
   
   /**
    * 存储订单当前状态
    */
   void              StoreState(void);
   
   /**
    * 检查订单状态是否变化
    * @return 如果状态变化返回 true，否则返回 false
    */
   bool              CheckState(void);
};
//+------------------------------------------------------------------+